
#ifndef MODBUS_REGISTER_H
#define MODBUS_REGISTER_H

#include "sys_pub.h"

// 寄存器地址最大值
#define MODBUS_REG_MAX_ADDR        0x0074

// 首页模块 (0x0000-0x0006)
#define REG_SOLD_OUT_STATUS        0x0000  // 售罄状态(0:不售罄，1:售罄)
#define REG_OPERATION_MODE         0x0001  // 运行模式(0:空闲/1:制冷/2:清洗/3:解冻/4:保鲜)
#define REG_ICE_FORM_RATIO         0x0002  // 冰淇淋成型比例
#define REG_STOP                   0x0003  // STOP状态
#define REG_RETURN_ORIGIN          0x0004  // 回原点状态
#define REG_MAIN_UNIT              0x0005  // 主机状态
#define REG_DEVICE_MODE            0x0006  // 设备模式(0:日间/1:夜间)

// 自动制作模块 (0x0007-0x0009)
#define REG_JAM_ING_SET_BASE       0x0007  // 果酱原料集合(数组[3])
#define REG_TOPPING_ING_SET_BASE   0x000A  // 顶料原料集合(数组[3])
#define REG_AUTO_PRODUCTION        0x000D  // 自动制作(0:关闭，1:开启)

// 冰淇淋设置模块 (0x000A-0x001A)
#define REG_CUP_PICKUP_POS_BASE    0x000A  // 取杯位置XZ轴(数组[2])
#define REG_ING_POS_BASE           0x000B  // 原料位置XZ轴(数组[2])
#define REG_CUP_DISP_POS_BASE      0x000C  // 出杯位置XZ轴(数组[2])
#define REG_MANUAL_SPEED_BASE      0x000D  // 手动速度XZ轴(数组[2])
#define REG_ICE1_REMAIN_COUNT      0x000E  // 冰淇淋一剩余出杯数
#define REG_REMAIN_AFTER_SHORTAGE  0x000F  // 原料欠料后可售杯数
#define REG_TOTAL_DISP_TIME_BASE   0x0010  // 原料总出料时间一、二(数组[2])
#define REG_MANUAL_CUP_DISP        0x0011  // 手动下杯

// 顶料位置模块 (0x0012-0x001A)
#define REG_TOPPING1_POS_BASE      0x0012  // 顶料1 XZ轴位置(数组[2])
#define REG_TOPPING1_TIME_BASE     0x0013  // 顶料1 出料时间+完成延时(数组[2])
#define REG_TOPPING1_REMAIN_COUNT  0x0014  // 顶料1 剩余出杯数
#define REG_TOPPING2_POS_BASE      0x0015  // 顶料2 XZ轴位置(数组[2])
#define REG_TOPPING2_TIME_BASE     0x0016  // 顶料2 出料时间+完成延时(数组[2])
#define REG_TOPPING2_REMAIN_COUNT  0x0017  // 顶料2 剩余出杯数
#define REG_TOPPING3_POS_BASE      0x0018  // 顶料3 XZ轴位置(数组[2])
#define REG_TOPPING3_TIME_BASE     0x0019  // 顶料3 出料时间+完成延时(数组[2])
#define REG_TOPPING3_REMAIN_COUNT  0x001A  // 顶料3 剩余出杯数

// 果酱设置模块 (0x001B-0x0023)
#define REG_JAM1_POS_BASE          0x001B  // 果酱1 XZ轴位置(数组[2])
#define REG_JAM1_TIME_BASE         0x001C  // 果酱1 出料时间+完成延时(数组[2])
#define REG_JAM1_REMAIN_COUNT      0x001D  // 果酱1 剩余出杯数
#define REG_JAM2_POS_BASE          0x001E  // 果酱2 XZ轴位置(数组[2])
#define REG_JAM2_TIME_BASE         0x001F  // 果酱2 出料时间+完成延时(数组[2])
#define REG_JAM2_REMAIN_COUNT      0x0020  // 果酱2 剩余出杯数
#define REG_JAM3_POS_BASE          0x0021  // 果酱3 XZ轴位置(数组[2])
#define REG_JAM3_TIME_BASE         0x0022  // 果酱3 出料时间+完成延时(数组[2])
#define REG_JAM3_REMAIN_COUNT      0x0023  // 果酱3 剩余出杯数

// 语音设置模块 (0x0024-0x0025)
#define REG_NO_CUP_ANNOUNCE_TIME   0x0024  // 无人取杯间隔播报时间
#define REG_IDLE_ANNOUNCE_TIME     0x0025  // 空闲间隔播报时间

// 主机设置模块 (0x0026-0x0028)
#define REG_SELLING_TIME_BASE      0x0026  // 售卖时间(开始-结束)(数组[2])
#define REG_SET_HARDNESS           0x0027  // 设定硬度
#define REG_REFRIG_TEMP            0x0028  // 冷藏温度

// 设备统计模块 (0x0029-0x0036)
#define REG_TOTAL_CUP_START        0x0029  // 设备售卖总杯数起时间
#define REG_TOTAL_CUP_COUNT        0x002A  // 设备售卖总杯数
#define REG_JAM1_DISP_START        0x002B  // 果酱1出料次数起时间
#define REG_JAM1_DISP_COUNT        0x002C  // 果酱1出料次数
#define REG_JAM2_DISP_START        0x002D  // 果酱2出料次数起时间
#define REG_JAM2_DISP_COUNT        0x002E  // 果酱2出料次数
#define REG_JAM3_DISP_START        0x002F  // 果酱3出料次数起时间
#define REG_JAM3_DISP_COUNT        0x0030  // 果酱3出料次数
#define REG_TOP1_DISP_START        0x0031  // 顶料1出料次数起时间
#define REG_TOP1_DISP_COUNT        0x0032  // 顶料1出料次数
#define REG_TOP2_DISP_START        0x0033  // 顶料2出料次数起时间
#define REG_TOP2_DISP_COUNT        0x0034  // 顶料2出料次数
#define REG_TOP3_DISP_START        0x0035  // 顶料3出料次数起时间
#define REG_TOP3_DISP_COUNT        0x0036  // 顶料3出料次数

// 制冷机参数设置 (0x0037-0x003F)
#define REG_FIRST_AIR_PUMP_TIME    0x0037  // 第一次气泵工作时间
#define REG_MATERIAL_AIR_PUMP_TIME 0x0038  // 打料气泵工作时间
#define REG_AIR_PUMP_DELAY_TIME    0x0039  // 打料气泵延时工作时间
#define REG_NIGHT_HEAT_INTERVAL    0x003A  // 夜间保温间隔时间
#define REG_NIGHT_COOL_CLEAN_TIME  0x003B  // 夜间转制冷清洗时间
#define REG_PUMP_MAX_TIME          0x003C  // 抽料允许最长时间
#define REG_AUTO_RESTART_TIME      0x003D  // 自动重启时间
#define REG_PUMP_START_COUNT       0x003E  // 抽料开始出料数
#define REG_THAWING_TIME           0x003F  // 解冻时间

// 工厂设置模块 (0x0040-0x0052)
#define REG_ALARM_RANGE_BASE       0x0040  // 报警值区间(低-高)(数组[2])
#define REG_VOLTAGE_ALARM_EN       0x0041  // 电压报警使能
#define REG_PRECOOL_HYSTERESIS     0x0042  // 预冷回差温度
#define REG_COOL_EXCEED_TIME       0x0043  // 制冷超过时间
#define REG_COMPRESSOR_DELAY       0x0044  // 压缩机开延时
#define REG_AGITATOR_STOP_DELAY    0x0045  // 搅拌机关延时
#define REG_CUP_FALL_DELAY         0x0046  // 落杯机器位置延时时间
#define REG_CUP_FALL_MAX_TIME      0x0047  // 落杯机器工作最长时间
#define REG_TROUGH_TEMP_CORR       0x0048  // 料槽温度修正
#define REG_CYLINDER_TEMP_CORR     0x0049  // 料缸温度修正
#define REG_COMPRESSOR_TEMP_CORR   0x004A  // 压机温度修正
#define REG_VOLTAGE_CORR           0x004B  // 电压修正
#define REG_INVERTER_MIN_CURRENT   0x004C  // 变频器故障最小电流(A)
#define REG_CLEANING_DAYS          0x004D  // 清洗天数
#define REG_STERILIZING_START      0x004E  // 杀菌灯开始
#define REG_STERILIZING_WORKING    0x004F  // 杀菌灯工作
#define REG_MAC_LOCK               0x0050  // MAC锁定
#define REG_MAC_ID_BASE            0x0051  // MAC标识(数组[2])
#define REG_AUTO_SPEED_BASE        0x0052  // 自动速度XZ(数组[2])

// 输入数据查看 (0x0053-0x005E)
#define REG_X_AXIS_ORIGIN          0x0053  // X轴原点(X0)
#define REG_Z_AXIS_ORIGIN          0x0054  // Z轴原点(X1)
#define REG_CUP_FALL_MACHINE       0x0055  // 落杯机器(X4)
#define REG_CUP_DETECTION          0x0056  // 杯子检测(X7)
#define REG_FLOAT_BALL_SHORTAGE    0x0057  // 浮球欠料(X9)
#define REG_OPPOSING_BEAM          0x0058  // 对射信号(X11)
#define REG_GRIPPER_SWITCH         0x0059  // 夹手开关(X12)
#define REG_TROUGH_TEMP            0x005A  // 料槽温度(RT1)
#define REG_CYLINDER_TEMP          0x005B  // 料缸温度(RT2)
#define REG_COMPRESSOR_TEMP        0x005C  // 压机温度(RT3)
#define REG_CURRENT                0x005D  // 电流
#define REG_VOLTAGE                0x005E  // 电压

// 输出数据查看 (0x005F-0x0074)
#define REG_TOPPING1               0x005F  // 顶料1(Y0)
#define REG_TOPPING2               0x0060  // 顶料2(Y1)
#define REG_TOPPING3               0x0061  // 顶料3(Y2)
#define REG_JAM1                   0x0062  // 果酱1(Y3)
#define REG_JAM2                   0x0063  // 果酱2(Y4)
#define REG_JAM3                   0x0064  // 果酱3(Y5)
#define REG_CUP_FALL_MOTOR         0x0065  // 落杯电机(Y6)
#define REG_PUFFING_PUMP           0x0066  // 膨化泵(Y8)
#define REG_MAIN_COMPRESSOR        0x0067  // 主压机(Y14)
#define REG_MAIN_MOTOR             0x0068  // 主电机(Y15)
#define REG_DISPENSING_PUSH_ROD    0x0069  // 出料推杆(1/2 ZZ/FZ)
#define REG_ELECTRIC_DOOR_ROD      0x006A  // 电动推门杆(3/4 ZZ/FZ)
#define REG_TROUGH_COOL_VALVE      0x006B  // 料槽制冷阀(Y16)
#define REG_CYLINDER_COOL_VALVE    0x006C  // 冷冻缸制冷阀(Y17)
#define REG_CYLINDER_HEAT_VALVE    0x006D  // 冷冻缸制热阀(Y19)
#define REG_STERILIZING_LAMP       0x006E  // 杀菌灯(Y21)
#define REG_NIGHT_MODE             0x006F  // 夜间模式(Y22)
#define REG_X_AXIS_LEFT            0x0070  // X轴左
#define REG_X_AXIS_RIGHT           0x0071  // X轴右
#define REG_Z_AXIS_UP              0x0072  // Z轴上
#define REG_Z_AXIS_DOWN            0x0073  // Z轴下
#define REG_XZ_AXIS_POS_BASE       0x0074  // XZ轴位置(数组[2])

// 模块函数声明
uint16_t modbus_home_get(uint16_t address);
void modbus_home_set(uint16_t address, uint16_t value);

uint16_t modbus_production_get(uint16_t address);
void modbus_production_set(uint16_t address, uint16_t value);
// 冰淇淋设置模块
uint16_t modbus_ice_cream_get(uint16_t address);
void modbus_ice_cream_set(uint16_t address, uint16_t value);

// 顶料位置模块
uint16_t modbus_topping_get(uint16_t address);
void modbus_topping_set(uint16_t address, uint16_t value);

// 果酱设置模块
uint16_t modbus_jam_get(uint16_t address);
void modbus_jam_set(uint16_t address, uint16_t value);

uint16_t modbus_settings_get(uint16_t address);
void modbus_settings_set(uint16_t address, uint16_t value);

uint16_t modbus_io_get(uint16_t address);
void modbus_io_set(uint16_t address, uint16_t value);

uint16_t modbus_statistics_get(uint16_t address) ;
bool modbus_register_handler(uint16_t address, uint16_t* value, bool is_write);

#endif // MODBUS_REGISTER_H
